﻿using System.Collections.Generic;
using System.Data;
using System.Linq;
using COMMON;
using VO;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;

namespace DAL
{
    public class CampanhaAtendenteDAL
    {

        private Database db;
        private DbTransaction transaction;

        #region Construtor
        public CampanhaAtendenteDAL()
        {
            DaoFactory objFactory = new DaoFactory(Configuracao.ConnectionString());
            transaction = objFactory.transaction;
            db = objFactory.db;
        }
        #endregion

        #region Insert
        public void Insert(CampanhaAtendente obj)
        {
            using (var contexto = new CallcenterEntities())
            {
                var objC = new tbCCCampanha_Atendente();
                objC = PopulaObjeto(obj, objC);
                contexto.AddTotbCCCampanha_Atendente(objC);
                contexto.SaveChanges();
            }
        }
        #endregion

        #region Delete
        public void Delete(int idCampanha)
        {
            using (var contexto = new CallcenterEntities())
            {
                var campanha = (from campanhaAux in contexto.tbCCCampanha_Atendente
                                where campanhaAux.idCampanha == idCampanha
                                select campanhaAux);
                foreach (var obj in campanha)
                {
                    contexto.DeleteObject(obj);
                }
                contexto.SaveChanges();
            }
        }

        public void Delete(int idCampanha, int idAtendente)
        {
            using (var contexto = new CallcenterEntities())
            {
                var campanha = (from campanhaAux in contexto.tbCCCampanha_Atendente
                                where campanhaAux.idCampanha == idCampanha && campanhaAux.idAtendente== idAtendente
                                select campanhaAux).FirstOrDefault();
                contexto.DeleteObject(campanha);
                contexto.SaveChanges();
            }
        }
        #endregion

        #region Select
        public IList<Campanha> Select(int idAtendente)
        {
            using (var contexto = new CallcenterEntities())
            {
                IQueryable<tbCCCampanha> campanha;

                campanha = (from atendenteAux in contexto.tbCCCampanha_Atendente
                            join campanhaAux in contexto.tbCCCampanha on atendenteAux.idCampanha equals campanhaAux.idCampanha
                            where atendenteAux.idAtendente == idAtendente
                            select campanhaAux);

                //Carrega lista
                var list = PopulaObjeto(campanha);

                return list;
            }
        }

        public IList<CampanhaAtendente> Select(int idCampanha, string nomeAtendente = "", string letra = "")
        {
            using (var contexto = new CallcenterEntities())
            {
                //IQueryable<tbCCCampanha_Atendente> campanha;

                var campanha = (from campanhaAux in contexto.tbCCCampanha_Atendente
                                join atendAux in contexto.tbCCAtendente on campanhaAux.idAtendente equals atendAux.idAtendente
                                where campanhaAux.idCampanha == idCampanha
                                && (atendAux.Nome.Contains(nomeAtendente) || nomeAtendente == "")
                                && (atendAux.Nome.ToUpper().Substring(0, 1) == letra || letra == "")
                                select new CampanhaAtendente { idCampanhaAtendente = campanhaAux.idCampanhaAtendente, idCampanha = campanhaAux.idCampanha, idAtendente = campanhaAux.idAtendente, NomeAtendente = atendAux.Nome }).OrderBy(c => c.NomeAtendente).ToList();

                //Carrega lista
                //var list = PopulaObjeto(campanha);

                return campanha;
            }
        }

        public IList<CampanhaAtendente> Select(int idCampanha, int idAtendente)
        {
            using (var contexto = new CallcenterEntities())
            {
                IQueryable<tbCCCampanha_Atendente> campanha;

                campanha = (from campanhaAux in contexto.tbCCCampanha_Atendente
                            where campanhaAux.idCampanha == idCampanha && campanhaAux.idAtendente == idAtendente
                            select campanhaAux);

                //Carrega lista
                var list = PopulaObjeto2(campanha);

                return list;
            }
        }
        #endregion

        #region SelectAtendenteSemCampanha
        public IList<CampanhaAtendente> SelectAtendenteSemCampanha(int idCampanha, string nomeAtendente = "", string letra = "")
        {
            using (var contexto = new CallcenterEntities())
            {
                var cliente = (from atendAux in contexto.tbCCAtendente
                               where !(from campanhaAux in contexto.tbCCCampanha_Atendente
                                       where campanhaAux.idCampanha == idCampanha
                                       select campanhaAux.idAtendente)
                                          .Contains(atendAux.idAtendente)
                                          && !string.IsNullOrEmpty(atendAux.Nome)
                                          && (atendAux.Nome.Contains(nomeAtendente) || nomeAtendente == "")
                                          && (atendAux.Nome.ToUpper().Substring(0, 1) == letra || letra == "")
                               select new CampanhaAtendente { idAtendente = atendAux.idAtendente, NomeAtendente = atendAux.Nome })
                               .OrderBy(c => c.NomeAtendente).ToList();

                return cliente;
            }
        }
        #endregion

        #region QuantidadeAtendenteCampanha
        public int QuantidadeAtendenteCampanha(int idCampanha)
        {
            using (var contexto = new CallcenterEntities())
            {
                var campanha = (from campanhaAux in contexto.tbCCCampanha_Atendente
                                where campanhaAux.idCampanha == idCampanha
                                select campanhaAux).Count();

                return campanha;
            }
        }
        #endregion

        #region CopiaAtendente
        public void CopiaAtendente(int idCampanha, int idCampanhaNova)
        {
            DbCommand dbCommand = db.GetStoredProcCommand("IN_RegraCampanha");
            db.AddInParameter(dbCommand, "idCampanha", DbType.Int32, idCampanha);
            db.AddInParameter(dbCommand, "idCampanhaNova", DbType.Int32, idCampanhaNova);
            db.ExecuteNonQuery(dbCommand);
        }
        #endregion

        #region PopulaObjeto
        protected static tbCCCampanha_Atendente PopulaObjeto(CampanhaAtendente obj, tbCCCampanha_Atendente tabela)
        {
            tabela.idCampanha = obj.idCampanha;
            tabela.idAtendente = obj.idAtendente;
            return tabela;
        }

        protected static IList<Campanha> PopulaObjeto(IQueryable<tbCCCampanha> reader)
        {
            IList<Campanha> list = new List<Campanha>();
            foreach (var obj in reader)
            {
                var newObj = new Campanha();
                newObj.idCampanha = obj.idCampanha;
                newObj.nomeCampanha = obj.nomeCampanha;
                list.Add(newObj);
            }
            return list;
        }

        protected static IList<CampanhaAtendente> PopulaObjeto2(IQueryable<tbCCCampanha_Atendente> reader)
        {
            IList<CampanhaAtendente> list = new List<CampanhaAtendente>();
            foreach (var obj in reader)
            {
                var newObj = new CampanhaAtendente();
                newObj.idCampanha = obj.idCampanha;
                newObj.idAtendente = obj.idAtendente;
                newObj.idCampanhaAtendente = obj.idCampanhaAtendente;
                list.Add(newObj);
            }
            return list;
        }
        #endregion

    }
}